#ifndef KEY_H
#define KEY_H

#include "Cpu.h"

/*
定义按键的IO、最大按键数量、按键扫描周期（利用扫描周期进行消抖，建议20ms）
*/
#define KEY1_GPIO PORT_E
#define KEY1_PIN GPIO_8
#define KEY2_GPIO PORT_B
#define KEY2_PIN GPIO_5
#define KEY3_GPIO PORT_B
#define KEY3_PIN GPIO_4
#define KEY4_GPIO PORT_C
#define KEY4_PIN GPIO_3
#define KEY5_GPIO PORT_C
#define KEY5_PIN GPIO_2
#define KEY6_GPIO PORT_D
#define KEY6_PIN GPIO_5
#define KEY7_GPIO PORT_C
#define KEY7_PIN GPIO_1
#define KEY8_GPIO PORT_C
#define KEY8_PIN GPIO_16
#define KEY_MAX 8u
#define KEY_SCAN_MS 20u
#define MS_TO_CYCLE(x) ((uint8_t)(x/20u))

/*定义按键状态*/
typedef enum
{
    KEY_UP = 0,
    KEY_DOWM,
    KEY_HOLD,
    KEY_LOOSE,
}KEY_STA;

/*定义按键的事件*/
typedef enum
{
    FREE_EVENT = 0,
    TRI_EVENT,
    SHORT_EVENT,
    LONG_EVENT,
    LOOSE_EVENT,
}KEY_EVENT;

/*按键所需结构体*/
typedef struct 
{
    KEY_STA sta;
    KEY_EVENT event;
    uint8_t short_cnt; /*短按事件的触发计数值*/
    uint8_t long_cnt; /*长按事件的触发计数值*/
    uint8_t cnt; /*按键按下的计数值*/
    uint8_t level; /*按键按下时IO的值*/
    PORT_ID_t gpio; /*按键对应的gpio*/
    PORT_GPIONO_t pin; /*按键对应的pin*/
}KEY_t;

extern KEY_t key[KEY_MAX];
extern void KEY_Init(void);
extern void KEY_Scan(void);

#endif 
